/*
 * LosJavatos.java
 *
 * Creado el 01 de mayo de 2008
 *
 */

package futbol.tacticas.concursantes.LosJavatos;
import java.awt.Color;
import java.awt.Point;
import java.util.Vector;

import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoPase;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;
import futbol.tacticas.concursantes.Tactica;
/**
 *
 * @author Ricardo Moraleda
 * GELIDA (BARCELONA)
 * BLOG en http://rickymoga.blogspot.com
 */
public class LosJavatos implements Tactica{
    
    
    private int nValores[][]={
            {-150,0,7},  // Jugador 1[0]
            {-90,-15,4},  // Jugador 2[1]
            {-60,60,6},  // Jugador 3[2]
            {-60,-60,6},  // Jugador 4[3]
            {0,20,6},  // Jugador 5[4]
            {-10,-20,6},  // Jugador 6[5]
            {50,50,7},  // Jugador 7[6]
            {50,-50,7},  // Jugador 8[7]
            {100,30,7},  // Jugador 9[8]
            {120,0,7},  // Jugador 10[9]
            {100,-80,7}  // Jugador 11[10]
        };
    
    
        
    public Color getColor1() {
        return Color.YELLOW;
    }

    public Color getColor2() {
        return Color.YELLOW;
    }

    public Color getColorNumero() {
        return Color.BLUE;
    }

    public String getNombre() {
        return "Los Javatos";
    }

    public int getXInicial(int n) {
        return nValores[n][0];
    }

    public int getYInicial(int n) {
        return nValores[n][1];
    }

    public int getFuerza(int n) {
        return nValores[n][2];
    }

    
    
//	 Recta trazada por la bola y = mx + o
	private double o;
	private double m;

//	 Recta desde el balon hasta el punto medio de la porteria y = ax+ b
	private double a;
	private double b;
	
	private Point posicionBalonAnterior = new Point();
	private Point posicionBalonSiguiente = new Point();
	
	private double distanciaRecorridaBalonEjeX;
    private double distanciaRecorridaBalonEjeY;   
    
    
    @SuppressWarnings("unchecked")
	public Vector<Comando> getComandos(SituacionJugadores sj){
        
    	
    	Vector<Comando> comandos = new Vector();
    	
        Point bola = sj.getBola();
        
        //Calcula la posición futura de la bola
        bola = calculoPosicionBola(bola);
        
             
        Vector<Integer> jugadoresCubiertos = new Vector();
        jugadoresCubiertos.removeAllElements();
        
        int nJugCercano = sj.getMiJugadorMasCerca(bola.getX(), bola.getY());
        int desvio = 0;
        
        for (int n = 0;n < 11;n ++) {
        	
	        moverPortero(sj, comandos);
        
            //CAMPO CONTRARIO
            
	        if (bola.x >= 20) {
	        	if (n < 5) {
	        		comandos.add(new ComandoIrA(n,getXInicial(n),getYInicial(n)));
	        	} else {
	        		comandos.add(new ComandoIrA(nJugCercano,bola.getX(), bola.getY()));	
	        	}
	        		        	
	        	if (Math.abs(bola.getX()) < 70 && Math.abs(bola.getY()) > 55 && n < 8){
	        	   	comandos.add(new ComandoPase(n, sj.getSiguienteJugador(n)));	
	            } else {
	                comandos.add(new ComandoTiroAPuerta(n, desvio));
		        }
	        	
	        
	        //CAMPO PROPIO	
	        } else {
	        	
	        	//Movimientos cubrir delanteros y medios
	        	
	        	if (n > 1) {
	        		//comandos.add(new ComandoIrA(n,getXInicial(n),getYInicial(n)));
	        		//Si el contrario ya está cubierto, no se vuelve a cubrir (no repetimos 2 defensas con un delantero)
	        		if (!jugadoresCubiertos.contains(new Integer(sj.getContrarioMasCerca(n)))) {
	        			cubrir(n, sj.getContrarioMasCerca(n), sj, comandos);
	        			jugadoresCubiertos.addElement(new Integer(sj.getContrarioMasCerca(n)));
	        		} else {
	        			comandos.add(new ComandoIrA(n,getXInicial(n),getYInicial(n)));
	        		}
	        		
	        	} else {
	        		cubrir(1, sj.getContrarioMasCerca(0), sj, comandos);	
	        	}
	        	
	        	
	        	//si bola dentro de mi área 
	        	if(bola.getX() < -125 && (bola.getY() > -60 && bola.getY() < 60)){
	        		comandos.add(new ComandoIrA(nJugCercano,bola.getX(), bola.getY()));
	        	}
	        	
	        	//Los delanteros mantienen la posición inicial
	        	if (n >= 8) {
	        		comandos.add(new ComandoIrA(n,getXInicial(n),getYInicial(n)));
	        	    
		            //Movimientos de mis delanteros
		            int y = 0;
	        		y = (int)(bola.getY()/2);
		            if (y < -30) y = -30;
		            if (y > 30) y = 30;
		            
		            if (n != 8) {
		            	comandos.add(new ComandoIrA(n,getXInicial(n) - 50,getYInicial(n) + y));
		            } else {
		            	comandos.add(new ComandoIrA(n,getXInicial(n),getYInicial(n) + y - 10));
		            }
		            
	        	} else if (n != 2 && n != 3 && n != 4 && n != 5) {
	        		comandos.add(new ComandoIrA(nJugCercano,bola.getX(), bola.getY()));	
	        	}
	        	
	            if (n >= 8) {
	        		comandos.add(new ComandoTiroAPuerta(n,desvio));
	        	} else {
	        		comandos.add(new ComandoPase(n, 10));
	        	}
	     
	        }
        }
        
        //Posicion real de la bola
        this.posicionBalonAnterior.setLocation(sj.getBola());
        
        return comandos;
    }
    
    
    public void cubrir(int nJug, int nCon, SituacionJugadores sj, Vector<Comando> comandos){
        
        double x = sj.getBola().getX() - sj.getContrario()[nCon].getX();
        double y = sj.getBola().getY() - sj.getContrario()[nCon].getY();
        
        //Distancia del contrario a la bola
        double n = Math.sqrt(Math.pow(x,2) + Math.pow(y,2));
        
        //Posiciona al jugador en un punto intermedio de la recta que une el contrario y la bola
        double nx = sj.getContrario()[nCon].getX() + (x/n)*20;
        double ny = sj.getContrario()[nCon].getY() + (y/n)*20;
        
        comandos.add(new ComandoIrA(nJug,(int)nx,(int)ny)); 

    }
   
    
    private Point calculoPosicionBola(Point bola) {
    	
        //	Recta descrita por la bola (Y = mX + o).
        //m = pendiente de la recta
    	//o = valor del eje Y cuando X = 0
    	m = (bola.getY() - posicionBalonAnterior.getY())/(bola.getX() - posicionBalonAnterior.getX());
        o = bola.getY() - m * bola.getX();

        distanciaRecorridaBalonEjeX = bola.getX() - posicionBalonAnterior.getX();
        distanciaRecorridaBalonEjeY = bola.getY() - posicionBalonAnterior.getY();
        
        //Posición de la bola siguiente iteración. Calculada para saber saber la posición futura de la bola.
        posicionBalonSiguiente.setLocation(bola.getX() + distanciaRecorridaBalonEjeX, bola.getY() + distanciaRecorridaBalonEjeY);
        
        // Se calcula la recta desde el balon al punto medio de la porteria
        if (bola.getX ()== -160)
        {
            a = bola.getY() * 100;
            b = 160;
        }
        else
        {
            a = bola.getY() / (bola.getX() + 160);            
            b = 160 * a;                
        }  
        
        //La bola actual tendrá las coordenadas de su futura posición
        //De este modo los jugadores se anticiparán a los contrarios
        bola = posicionBalonSiguiente;
    
        return bola;
    }
    
    
    
    private void moverPortero (SituacionJugadores sj, Vector<Comando> comandos)
    {
    	
    	Point bola = sj.getBola();
    	//Movimiento del portero
        
        double y = 0;
        double x = 0;

        double yaux=0;

        yaux = o - 160 * m;

        if ((yaux <= 30) && (yaux >= -30)) // Si va a porteria la bola
        {
            // El portero se pone en medio de la direccion de la bola
            y = o - 155 * m;
            x = -155;
        }          
        else
        {
            // El portero se pone entre la bola y el punto medio de la porteria 
        	//más un incremento para cubrir el palo más cercano a la bola
            x = -155;                
            if (bola.getY() >= 20)
            {
                y = (-155) * a + b + 10;                    
            }
            else if (bola.getY() <= -20)
            {
                y = (-155) * a + b - 10;    
            }
            else
            {
                y = (-155) * a + b;    
            }
        }
        
        comandos.add(new ComandoIrA(0,x,y));
        comandos.add(new ComandoGolpearBola(0, Math.abs(bola.x) + 70, Math.abs(bola.y) + 40));
        
    }
    
}